home *** CD-ROM | disk | FTP | other *** search
- {-------------------------------------------------------------------}
- { A simple program to illustrate how to plot pixels and draw lines }
- { in the 320x200 256 color mode available on the VGA and MCGA cards }
- { }
- { Last update: 5/24/88 by John Sieraski 76117,2022 }
- {-------------------------------------------------------------------}
-
- {$R-,S-}
-
- uses
- Crt, Dos;
-
- procedure PutPixel(X, Y : word; Color : byte);
- { Plot a pixel at (X, Y) in Color }
- begin
- Mem[$A000:Y*320+X] := Color;
- end;
-
- procedure Switch(var First, Second : integer);
- { Exchange the values of First and second }
- var
- Temp : integer;
- begin
- Temp := First;
- First := Second;
- Second := Temp;
- end; { Switch }
-
- procedure Line(X1, Y1, X2, Y2, Color : integer);
- { Uses Bressenham's algorithm for drawing a line }
- var
- LgDelta, ShDelta, LgStep, ShStep, Cycle, PointAddr : integer;
-
- begin
- LgDelta := X2 - X1;
- ShDelta := Y2 - Y1;
- if LgDelta < 0 then
- begin
- LgDelta := -LgDelta;
- LgStep := -1;
- end
- else
- LgStep := 1;
- if ShDelta < 0 then
- begin
- ShDelta := -ShDelta;
- ShStep := -1;
- end
- else
- ShStep := 1;
- if LgDelta > ShDelta then
- begin
- Cycle := LgDelta shr 1; { LgDelta / 2 }
- while X1 <> X2 do
- begin
- Mem[$A000:Y1*320+X1] := Color; { PutPixel(X1, Y1, Color); }
- Inc(X1, LgStep);
- Inc(Cycle, ShDelta);
- if Cycle > LgDelta then
- begin
- Inc(Y1, ShStep);
- Dec(Cycle, LgDelta);
- end;
- end;
- end
- else
- begin
- Cycle := ShDelta shr 1; { ShDelta / 2 }
- Switch(LgDelta, ShDelta);
- Switch(LgStep, ShStep);
- while Y1 <> Y2 do
- begin
- Mem[$A000:Y1*320+X1] := Color; { PutPixel(X1, Y1, Color); }
- Inc(Y1, LgStep);
- Inc(Cycle, ShDelta);
- if Cycle > LgDelta then
- begin
- Inc(X1, ShStep);
- Dec(Cycle, LgDelta);
- end;
- end;
- end;
- end; { Line }
-
- procedure SetMode(Mode : byte);
- { Interrupt $10, sub-function 0 - Set video mode }
- var
- Regs : Registers;
- begin
- with Regs do
- begin
- AH := 0;
- AL := Mode;
- end;
- Intr($10, Regs);
- end; { SetMode }
-
- var
- Row : integer;
- Color : byte;
- Ch : char;
- begin
- SetMode($13); { 320x200 256 color mode for VGA and MCGA cards }
- Color := 0;
- for Row := 0 to 199 do { Draw some lines }
- begin
- if Odd(Row) then
- begin
- Line(0, Row, 319, Row, Color);
- Inc(Color);
- end;
- end;
- Ch := ReadKey;
- TextMode(co80);
- end.